我看InstalViewModel裡面的程式碼時,其實有一些摸不著頭緒的地方,
排除MVVM風格跟我在寫MVC不同外,
主要是有很大的疑問是說BootstrapperApplication的執行順序是什麼?!
尤其InstallViewModel這邊加了很多個事件都跟執行順序有關聯,
我把他所有的事件整理放在一起了後,
最後當我注意到裡面的程式碼順序時
竟然不是很有潔癖的A~Z排序,而是感覺他是一段流程的排序,
所以我開始按照InstalViewModel裡面的事件順序排排看!!! 哈哈
//25 當引擎開始計劃安裝時觸發
model.BootstrapperApplication.PlanBegin += PlanBegin;
//26 當檢測階段完成時觸發。
model.BootstrapperApplication.DetectComplete += DetectComplete;
//27 當對特定包的檢測完成時觸發。
model.BootstrapperApplication.DetectPackageComplete += DetectPackageComplete;
//30 當引擎完成特定包的安裝規劃時觸發
model.BootstrapperApplication.PlanPackageComplete += PlanPackageComplete;
//43 當引擎完成安裝規劃時觸發。
model.BootstrapperApplication.PlanComplete += PlanComplete;
//44 當引擎開始安裝包時觸發。
model.BootstrapperApplication.ApplyBegin += ApplyBegin;
//46 當引擎完成安裝特定包時觸發。
model.BootstrapperApplication.ExecutePackageComplete += ExecutePackageComplete;
//48 當 Windows Installer 發送安裝消息時觸發
model.BootstrapperApplication.ExecuteMsiMessage += ExecuteMsiMessage;
//49 當引擎更改捆綁安裝的進度時觸發。
model.BootstrapperApplication.Progress += ApplyProgress;
//52 當引擎開始安裝特定包時觸發。
model.BootstrapperApplication.ExecutePackageBegin += ExecutePackageBegin;
//54 在引擎緩存安裝源後觸發
model.BootstrapperApplication.CacheComplete += CacheComplete;
//60 當引擎有進度獲取安裝源時觸發
model.BootstrapperApplication.CacheAcquireProgress += CacheAcquireProgress;
//73 在有效載荷上執行時由引擎觸發。
model.BootstrapperApplication.ExecuteProgress += ApplyExecuteProgress;
//74 當引擎完成安裝包時觸發。
model.BootstrapperApplication.ApplyComplete += ApplyComplete;
看起來好像是生命週期,
後來查到別人的解釋
https://stackoverflow.com/questions/21018262/wix-bootstrapper-sequence-of-bootstrapper-events
檢查(Detect) > 計畫(Plan)> 執行(Apply)
主要會分三階段,而每階段都是非同步的在執行,
所以實際上系統的執行順序應該為
//26 當檢測階段完成時觸發。
model.BootstrapperApplication.DetectComplete += DetectComplete;
//27 當對特定包的檢測完成時觸發。
model.BootstrapperApplication.DetectPackageComplete += DetectPackageComplete;
//25 當引擎開始計劃安裝時觸發
model.BootstrapperApplication.PlanBegin += PlanBegin;
//30 當引擎完成特定包的安裝規劃時觸發
model.BootstrapperApplication.PlanPackageComplete += PlanPackageComplete;
//43 當引擎完成安裝規劃時觸發。
model.BootstrapperApplication.PlanComplete += PlanComplete;
//44 當引擎開始安裝包時觸發。
model.BootstrapperApplication.ApplyBegin += ApplyBegin;
//46 當引擎完成安裝特定包時觸發。
model.BootstrapperApplication.ExecutePackageComplete += ExecutePackageComplete;
//48 當 Windows Installer 發送安裝消息時觸發
model.BootstrapperApplication.ExecuteMsiMessage += ExecuteMsiMessage;
//49 當引擎更改捆綁安裝的進度時觸發。
model.BootstrapperApplication.Progress += ApplyProgress;
//52 當引擎開始安裝特定包時觸發。
model.BootstrapperApplication.ExecutePackageBegin += ExecutePackageBegin;
//54 在引擎緩存安裝源後觸發
model.BootstrapperApplication.CacheComplete += CacheComplete;
//60 當引擎有進度獲取安裝源時觸發
model.BootstrapperApplication.CacheAcquireProgress += CacheAcquireProgress;
//73 在有效載荷上執行時由引擎觸發。
model.BootstrapperApplication.ExecuteProgress += ApplyExecuteProgress;
//74 當引擎完成安裝包時觸發。
model.BootstrapperApplication.ApplyComplete += ApplyComplete;
恩…
這樣程式碼上面的流程也合理了
由 27 DetectPackageComplete() 判斷安裝狀態,
會影響 25 PlanBegin() 依照安裝狀態給 progressPhases 1或2
那實際系統在啟動時
CustomBootstrapperApplication> Run > this.Engine.Detect();
這個Detect()就會去執行Detect判斷安裝狀態了,只是會非同步的回來。
一開始假設得很開心,
只是程式碼流程就不對了,
後來終於有查到解釋...
不然就讓你們看我瞎掰了,哈哈!
Day26程式碼
https://github.com/Aslan7826/defaultMVC/commits/Day26